import 'dart:convert';
import 'package:get/get.dart';
import 'package:flutter/foundation.dart';

import '../../../app/services/auth_service.dart';
import '../../../app/routes/app_routes.dart';
import '../../errors/exceptions.dart';

/// 错误修改器 - 处理HTTP响应错误
Future<Response> errorModifier(Request request, Response response) async {
  // 检查响应状态码
  if (response.isOk) {
    return response;
  }
  
  // 处理身份验证错误 (401)
  if (response.statusCode == 401) {
    try {
      final authService = Get.find<AuthService>();
      
      // 如果是刷新令牌请求，则直接注销
      if (request.url.path.contains('refresh-token')) {
        await authService.logout();
        Get.offAllNamed(AppRoutes.login);
        return response;
      }
      
      // 尝试刷新令牌
      final refreshResult = await authService.refreshToken();
      
      // 如果刷新成功，则重试原始请求
      if (refreshResult) {
        // 获取新的访问令牌
        final newToken = await authService.getAccessToken();
        
        // 更新请求头部
        request.headers['Authorization'] = 'Bearer $newToken';
        
        // 重新发送请求
        return await GetConnect().sendRequest(
          request.method,
          request.url.toString(),
          headers: request.headers,
          query: request.url.queryParameters,
          body: request.bodyBytes.isNotEmpty ? request.bodyBytes : null,
          contentType: request.contentType,
        );
      } else {
        // 刷新令牌失败，注销并跳转到登录页
        await authService.logout();
        Get.offAllNamed(AppRoutes.login);
      }
    } catch (e) {
      // 处理异常，注销并跳转到登录页
      Get.find<AuthService>().logout();
      Get.offAllNamed(AppRoutes.login);
    }
  }
  
  // 处理禁止访问错误 (403)
  else if (response.statusCode == 403) {
    Get.snackbar(
      '访问被拒绝',
      '您没有访问此资源的权限',
      snackPosition: SnackPosition.BOTTOM,
    );
  }
  
  // 处理资源未找到错误 (404)
  else if (response.statusCode == 404) {
    Get.snackbar(
      '未找到',
      '请求的资源不存在',
      snackPosition: SnackPosition.BOTTOM,
    );
  }
  
  // 处理服务器错误 (500+)
  else if (response.statusCode! >= 500) {
    Get.snackbar(
      '服务器错误',
      '服务器处理请求时出错，请稍后再试',
      snackPosition: SnackPosition.BOTTOM,
    );
  }
  
  // 为响应添加错误状态
  try {
    var body = response.body;
    
    // 如果响应体是字符串，尝试解析为JSON
    if (body is String) {
      try {
        body = json.decode(body);
      } catch (_) {
        // 如果解析失败，创建新的响应体
        body = {
          'status': 'error',
          'message': _getErrorMessage(response),
          'data': null
        };
      }
    } 
    // 如果响应体不是Map，创建新的响应体
    else if (body == null || body is! Map) {
      body = {
        'status': 'error',
        'message': _getErrorMessage(response),
        'data': null
      };
    }
    
    // 确保响应体有status字段
    if (body is Map && !body.containsKey('status')) {
      body['status'] = 'error';
    }
    
    // 确保响应体有message字段
    if (body is Map && !body.containsKey('message')) {
      body['message'] = _getErrorMessage(response);
    }
    
    // 创建新的响应对象
    return Response(
      statusCode: response.statusCode,
      statusText: response.statusText,
      body: body,
      headers: response.headers,
    );
  } catch (e) {
    // 如果处理错误时发生异常，返回原始响应
    return response;
  }
}

/// 从响应中获取错误消息
String _getErrorMessage(Response response) {
  try {
    if (response.body is Map) {
      final body = response.body as Map;
      
      if (body.containsKey('message')) {
        return body['message'].toString();
      }
      
      if (body.containsKey('error')) {
        return body['error'].toString();
      }
    }
    
    return response.statusText ?? _getDefaultErrorMessage(response.statusCode);
  } catch (_) {
    return response.statusText ?? _getDefaultErrorMessage(response.statusCode);
  }
}

/// 根据状态码获取默认错误消息
String _getDefaultErrorMessage(int? statusCode) {
  switch (statusCode) {
    case 400:
      return '请求参数错误';
    case 401:
      return '未授权，请重新登录';
    case 403:
      return '拒绝访问';
    case 404:
      return '请求的资源不存在';
    case 408:
      return '请求超时';
    case 500:
      return '服务器内部错误';
    case 502:
      return '网关错误';
    case 503:
      return '服务不可用';
    case 504:
      return '网关超时';
    default:
      return '请求失败(${statusCode ?? "未知"})';
  }
}

/// 错误处理修改器
/// 负责处理网络请求中的错误
class ErrorModifier {
  /// 响应修改器
  Future<Response> responseModifier(Request request, Response response) async {
    // 检查是否为成功响应
    if (!response.isOk) {
      // 处理服务器错误
      if (response.statusCode == 500) {
        if (kDebugMode) {
          print('服务器错误: ${response.statusText}');
        }
      }
      
      // 处理资源未找到
      if (response.statusCode == 404) {
        if (kDebugMode) {
          print('资源未找到: ${request.url}');
        }
      }
      
      // 处理请求错误
      if (response.statusCode == 400) {
        if (kDebugMode) {
          print('请求错误: ${response.bodyString}');
        }
      }
      
      // 处理禁止访问
      if (response.statusCode == 403) {
        if (kDebugMode) {
          print('禁止访问: ${request.url}');
        }
      }
    }
    
    return response;
  }
} 